package bots

import (
	"fmt"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/httplib"
	"smart_home/api/models"
	"strings"
)

type AnswerResult struct {
	Message string // 回复内容
	OpenMic bool   // 是否开麦
	IsEnd   bool   // 是否结束技能
}

func AddMessage(content string) *AnswerResult {
	return &AnswerResult{
		Message: content,
		OpenMic: false,
		IsEnd:   true,
	}
}

func (a *AnswerResult) Mic(b bool) *AnswerResult {
	a.OpenMic = b
	return a
}

func (a *AnswerResult) End(b bool) *AnswerResult {
	a.IsEnd = b
	return a
}

// 设备开关
// @param uid 用户id
// @param name 操作设备名称 如：空调
// @param isOpen 是否打开
func SwitchDevice(uid, name string, isOpen bool, awake ...string) *AnswerResult {
	var (
		names          []string
		scName, eqName string // 场景名称  设备名称
		eqs            []*models.Equipment
		eq             *models.Equipment
		url            = "http://api.rcenet.com/v2/switch/%s/%s"
		resMsg         = &models.ResultMsg{}
		act            = "打开"
		um             *models.UseMode
		err            error
	)

	if !isOpen {
		act = "关闭"
	}

	// 如果是操作使用模式
	if strings.Replace(name, "模式", "", 1)+"模式" == name {
		goto UseMode
	}

	goto Equipment

UseMode:
	um, err = models.GetUseModeByName(uid, name, "模式")
	if err != nil {
		return AddMessage("")
	}
	if um == nil {
		return AddMessage("您还没有" + name)
	}

	// 修改模式状态
	if isOpen {
		um.IsActivate = 1
	} else {
		if um.Trigger == models.UM_MANUAL {
			return AddMessage("手动触发不能手动关闭")
		}
		um.IsActivate = 0
	}

	if err := models.UpdateUseModeStatus(um); err != nil {
		return AddMessage("")
	}

	return AddMessage(name + "已经开启")

Equipment:
	names = strings.Split(name, "的")
	if len(names) == 2 {
		eqName = names[1]
		scName = names[0]
	} else {
		eqName = names[0]
	}

	eqs, err = models.GetAllEquipmentByUid(uid, 0, map[string]interface{}{"name": eqName})
	if err != nil {
		return AddMessage("")
	}

	// 没有找到设备
	if eqs == nil {
		return AddMessage("您还没有" + eqName)
	}

	// 找到设备数量 > 1 && 没有指定场景
	if l := len(eqs); l > 1 && len(scName) == 0 {
		str := "找到%d个%s, 你可以说：%s%s的%s"
		if len(awake) > 0 {
			str = "找到%d个%s, 你可以说：" + awake[0] + "%s%s的%s"
		}
		res := fmt.Sprintf(str, l, eqName, act, eqs[0].Scene.Name, eqName)
		return AddMessage(res).End(false).Mic(true)
	}

	// 如果指定了场景，则比对场景
	if len(scName) > 0 {
		for k, v := range eqs {
			if v.Scene.Name == scName {
				eq = eqs[k]
			}
		}
		if eq == nil {
			return AddMessage("您还没有" + eqName)
		}
	} else {
		eq = eqs[0]
	}

	s := "open"
	if !isOpen {
		s = "close"
	}

	if err = httplib.
		Get(fmt.Sprintf(url, s, eq.Sta)).
		Header("st", beego.AppConfig.String("st")).
		Header("suid", uid).
		ToJSON(resMsg); err != nil {
		return AddMessage("")
	}

	if resMsg.Code == 0 {
		return AddMessage(resMsg.Msg)
	}

	return AddMessage(name + "已" + act)
}

// 设备开关
// @param uid 用户id
// @param name 操作设备名称 如：空调
// @param time 操作时间 15:30:00
// @param timeString 操作时间原文 如：下午5点半
// @param isOpen 是否打开
func TimingDevice(uid, name, time, timeString string, isOpen bool, awake ...string) *AnswerResult {
	var (
		names          []string
		scName, eqName string // 场景名称  设备名称
		eqs            []*models.Equipment
		eq             *models.Equipment
		url            = "http://api.rcenet.com/v2/timing"
		resMsg         = &models.ResultMsg{}
		act            = "打开"
		err            error
	)

	if !isOpen {
		act = "关闭"
	}

	names = strings.Split(name, "的")
	if len(names) == 2 {
		eqName = names[1]
		scName = names[0]
	} else {
		eqName = names[0]
	}

	eqs, err = models.GetAllEquipmentByUid(uid, 0, map[string]interface{}{"name": eqName})
	if err != nil {
		return AddMessage("")
	}

	// 没有找到设备
	if eqs == nil {
		return AddMessage("您还没有" + eqName)
	}

	// 找到设备数量 > 1 && 没有指定场景
	if l := len(eqs); l > 1 && len(scName) == 0 {
		str := "找到%d个%s, 你可以说：%s%s的%s"
		if len(awake) > 0 {
			str = "找到%d个%s, 你可以说：" + awake[0] + "%s%s的%s"
		}
		res := fmt.Sprintf(str, l, eqName, act, eqs[0].Scene.Name, eqName)
		return AddMessage(res).End(false).Mic(true)
	}

	// 如果指定了场景，则比对场景
	if len(scName) > 0 {
		for k, v := range eqs {
			if v.Scene.Name == scName {
				eq = eqs[k]
			}
		}
		if eq == nil {
			return AddMessage("您还没有" + eqName)
		}
	} else {
		eq = eqs[0]
	}

	iDates := strings.Split(time, ":")
	timeVal := strings.Join(iDates[0:2], ":")
	timeKey := "start"

	if !isOpen {
		timeKey = "end"
	}

	if err = httplib.
		Post(url).
		Header("st", beego.AppConfig.String("st")).
		Header("suid", uid).
		Param("sta", eq.Sta).
		Param("wkocc", "0000000").
		Param("loop", "0").
		Param(timeKey, timeVal).
		ToJSON(resMsg); err != nil {
		return AddMessage("")
	}

	if resMsg.Code == 0 {
		return AddMessage(resMsg.Msg)
	}

	return AddMessage("已设置" + timeString + act + name)
}
